/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-04-26
 * Time: 8:04
 */
public class TestSinglyLinkedList {
        public static void main(String[] args) {
            testAddAtHead();       // 测试头插法
            testAddAtTail();       // 测试尾插法
            testAddAtIndex();      // 测试指定位置插入
            testDeleteAtIndex();   // 测试按索引删除
            testRemoveKey();       // 测试按值删除节点
            testRemoveAllKey();    // 测试删除所有匹配的节点
            testClear();           // 测试清空链表
            testContains();         // 测试查找存在性
            testGetSize();          // 测试获取链表长度
        }
        /**
         * 测试头插法 addAtHead
         */
        private static void testAddAtHead() {
            System.out.println("===== 测试头插法 =====");
            SinglyLinkedList list = new SinglyLinkedList();

            // 空链表插入头节点
            list.addAtHead(1);
            System.out.print("插入头节点 1 后: ");
            list.printList(); // 1

            // 继续插入头节点
            list.addAtHead(2);
            System.out.print("再插入头节点 2 后: ");
            list.printList(); // 2 1
            System.out.println("当前长度: " + list.getSize() + "\n"); // 2
        }
    /**
     * 测试尾插法 addAtTail
     */
    private static void testAddAtTail() {
        System.out.println("===== 测试尾插法 =====");
        SinglyLinkedList list = new SinglyLinkedList();

        // 空链表插入尾节点
        list.addAtTail(3);
        System.out.print("插入尾节点 3 后: ");
        list.printList(); // 3

        // 继续插入尾节点
        list.addAtTail(4);
        System.out.print("再插入尾节点 4 后: ");
        list.printList(); // 3 4
        System.out.println("当前长度: " + list.getSize() + "\n"); // 2
    }

    /**
     * 测试指定位置插入 addAtIndex
     */
    private static void testAddAtIndex() {
        System.out.println("===== 测试指定位置插入 =====");
        SinglyLinkedList list = new SinglyLinkedList();

        // 在空链表索引0处插入（相当于头插）
        list.addAtIndex(0, 5);
        System.out.print("在索引0插入5后: ");
        list.printList(); //  5

        // 在链表尾部插入（索引1）
        list.addAtIndex(1, 6);
        System.out.print("在索引1插入6后: ");
        list.printList(); // 5 6

        // 在中间位置插入（索引1）
        list.addAtIndex(1, 7);
        System.out.print("在索引1插入7后: ");
        list.printList(); // 5 7 6

        // 测试非法索引（不插入）
        list.addAtIndex(-1, 8); // 无效索引
        list.addAtIndex(5, 9);  // 无效索引
        System.out.print("尝试非法索引插入后: ");
        list.printList(); // 链表不变 5 7 6
        System.out.println("当前长度: " + list.getSize() + "\n"); // 3
    }

    /**
     * 测试按索引删除 deleteAtIndex
     */
    private static void testDeleteAtIndex() {
        System.out.println("===== 测试按索引删除 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        list.addAtTail(1);
        list.addAtTail(2);
        list.addAtTail(3);
        System.out.print("初始链表: ");
        list.printList(); // 1 2 3

        // 删除中间节点（索引1）
        list.deleteAtIndex(1);
        System.out.print("删除索引1后: ");
        list.printList(); // 1 3

        // 删除头节点（索引0）
        list.deleteAtIndex(0);
        System.out.print("删除头节点后: ");
        list.printList(); // 3

        // 删除唯一节点（索引0）
        list.deleteAtIndex(0);
        System.out.print("删除所有节点后: ");
        list.printList(); // 删除所有节点后:

        // 测试删除空链表（无操作）
        list.deleteAtIndex(0);
        System.out.println("当前长度: " + list.getSize() + "\n"); // 0
    }

    /**
     * 测试按值删除 remove
     */
    private static void testRemoveKey() {
        System.out.println("===== 测试按值删除 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        list.addAtTail(1);
        list.addAtTail(2);
        list.addAtTail(3);
        System.out.print("初始链表: ");
        list.printList(); // 1 2 3

        // 删除中间值2
        list.remove(2);
        System.out.print("删除值2后: ");
        list.printList(); // 1 3

        // 删除头节点1
        list.remove(1);
        System.out.print("删除头节点1后: ");
        list.printList(); // 3

        // 删除不存在的值5
        list.remove(5);
        System.out.print("尝试删除不存在的值5后: ");
        list.printList(); // 链表不变 3
        System.out.println("当前长度: " + list.getSize() + "\n"); // 1
    }

    /**
     * 测试删除所有匹配的节点 removeAllKey
     */
    private static void testRemoveAllKey() {
        System.out.println("===== 测试删除所有匹配节点 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        list.addAtTail(1);
        list.addAtTail(2);
        list.addAtTail(1);
        list.addAtTail(3);
        list.addAtTail(1);
        System.out.print("初始链表: ");
        list.printList(); // 1 2 1 3 1

        // 删除所有值为1的节点
        list.removeAllKey(1);
        System.out.print("删除所有1后: ");
        list.printList(); // 2 3
        System.out.println("当前长度: " + list.getSize() + "\n"); // 2
    }

    /**
     * 测试清空链表 clear
     */
    private static void testClear() {
        System.out.println("===== 测试清空链表 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        list.addAtTail(10);
        list.addAtTail(20);
        System.out.print("清空前: ");
        list.printList(); // 10 20

        list.clear();
        System.out.print("清空后: ");
        list.printList(); //
        System.out.println("清空后长度: " + list.getSize() + "\n"); // 0
    }

    /**
     * 测试存在性检查 contains
     */
    private static void testContains() {
        System.out.println("===== 测试存在性检查 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        list.addAtTail(10);
        list.addAtTail(20);

        System.out.println("链表是否包含10? " + list.contains(10)); // true
        System.out.println("链表是否包含20? " + list.contains(20)); // true
        System.out.println("链表是否包含30? " + list.contains(30) + "\n"); // false
    }

    /**
     * 测试获取链表长度 getSize
     */
    private static void testGetSize() {
        System.out.println("===== 测试获取长度 =====");
        SinglyLinkedList list = new SinglyLinkedList();
        System.out.println("空链表长度: " + list.getSize()); // 0

        list.addAtHead(1);
        list.addAtHead(2);
        System.out.println("添加两个节点后长度: " + list.getSize()); // 2
    }
}